package pe.edu.upc.karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import pe.edu.upc.karaoke.excepcion.DAOExcepcion;
import pe.edu.upc.karaoke.modelo.Administrador;
import pe.edu.upc.karaoke.modelo.Cliente;
import pe.edu.upc.karaoke.modelo.Local;
import pe.edu.upc.karaoke.modelo.Reserva;
import pe.edu.upc.karaoke.modelo.Sala;
import pe.edu.upc.karaoke.util.ConexionBD;


public class ReservaDAO extends BaseDAO {
		
	public Reserva obtener(int idReserva) throws DAOExcepcion {
		
		Reserva reserva = new Reserva();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query = "SELECT IDRESERVA, FECHA, DESCRIPCION FROM RESERVA WHERE IDRESERVA=? AND ELOG = 1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idReserva);
				rs = stmt.executeQuery();
				
				if (rs.next()) {
					reserva.setIdReserva(rs.getInt(1));
					reserva.setFecha(rs.getDate(2));
					reserva.setDescripcion(rs.getString(3));
				}
		} catch (SQLException e) {
				reserva = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return reserva;
	}

	public List<Reserva> listarReserva(String nombre) throws DAOExcepcion {
		
		String query =	"SELECT R.IDRESERVA, R.FECHA, R.DESCRIPCION, S.NOMBRE AS NO_SALA, L.NOMBRE AS NO_LOCAL, P.NOMBRES, P.PATERNO, P.MATERNO " +
						"FROM RESERVA R, SALA S, CLIENTE C, PERSONA P, LOCAL L  " +
						"WHERE R.IDSALA = S.IDSALA " +
						"AND R.IDCLIENTE = C.IDCLIENTE " +
						"AND C.DNI = P.DNI " +
						"AND S.IDLOCAL = L.IDLOCAL " +
						"AND CONCAT(P.NOMBRES , ' ' , P.PATERNO , ' ', P.MATERNO) LIKE ? " +
						"AND R.ELOG = 1";
		List<Reserva> lista = new ArrayList<Reserva>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {

				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + nombre + "%");
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					Reserva reserva = new Reserva();
					reserva.setIdReserva(rs.getInt("IDRESERVA"));
					reserva.setFecha(rs.getDate("FECHA"));
					reserva.setDescripcion(rs.getString("DESCRIPCION"));
					
					Sala sala = new Sala();
					sala.setNombre(rs.getString("NO_SALA"));
										
					Local local = new Local();
					local.setNombre(rs.getString("NO_LOCAL"));
					sala.setLocal(local);
					reserva.setSala(sala);
					
					Cliente cliente = new Cliente();
					cliente.setNombre(rs.getString("NOMBRES") + " " + rs.getString("PATERNO") + " "+ rs.getString("MATERNO"));
					reserva.setCliente(cliente);
					
					lista.add(reserva);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}

	public Reserva insertar(Reserva reserva) throws DAOExcepcion {
		
		java.util.Date d; //para trabajar con fecha y hora
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"INSERT INTO RESERVA (FECHA, DESCRIPCION, ELOG, IDSALA, IDCLIENTE) " +
								"VALUES (?,?,1,?,?)";
				
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				
				d = reserva.getFecha();
				java.sql.Timestamp dt = new java.sql.Timestamp(d.getTime());
				
				stmt.setTimestamp(1, dt);
				stmt.setString(2, reserva.getDescripcion());
				stmt.setInt(3, reserva.getSala().getIdsala());
				stmt.setInt(4, reserva.getCliente().getIdCliente());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO INSERTAR");
				}
	
				int id = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				reserva.setIdReserva(id);

		} catch (SQLException e) {
				reserva = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return reserva;
	}

	
	public String eliminar(int idReserva) throws DAOExcepcion {
		
		Reserva reserva = new Reserva();
		Connection con = null;
		PreparedStatement stmt = null;
		
		String vReturn = "NO_OK";
		try {
				String query = "UPDATE RESERVA SET ELOG = 0 WHERE IDRESERVA=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idReserva);
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ELIMINAR");
				}else{
					vReturn = "OK";
				}
		} catch (SQLException e) {
				reserva = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return vReturn;
	}

	
	public Reserva actualizar(Reserva reserva) throws DAOExcepcion {
		
		java.util.Date d; //para trabajar con fecha y hora
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
				String query =	"UPDATE RESERVA SET FECHA=?, DESCRIPCION=?, IDSALA=?, IDCLIENTE=? " +
								"WHERE IDRESERVA=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);

				d = reserva.getFecha();
				java.sql.Timestamp dt = new java.sql.Timestamp(d.getTime());

				stmt.setTimestamp(1, dt);
				stmt.setString(2, reserva.getDescripcion());
				stmt.setInt(3, reserva.getSala().getIdsala());
				stmt.setInt(4, reserva.getCliente().getIdCliente());
				stmt.setInt(5, reserva.getIdReserva());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ACTUALIZAR");
				}
		} catch (SQLException e) {
				reserva = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return reserva;
	}
	
}
